/**
 * @file nano_coder_if_def.h
 * @author 庞
 * @brief 定义NanoHost的包信息格式、编码/解码器接口，以解耦编码方式，实现多态。
 * @version 0.1
 * @date 2024-04-25
 * 
 * @copyright Copyright (c) 2024
 * 
 */

#pragma once

#include <stdint.h>

/**
 * @brief Nano编码器需要输出的包
 */
typedef struct{
    uint16_t cmd;
    uint8_t target_host;
    uint8_t source_host;
    uint8_t pack_id;
    uint8_t flag;
    uint8_t* payload_data;
    uint16_t payload_data_len;
}nano_pack_t;

typedef enum{
    NANO_NEED_MORE_BYTES,   //等待更多字节
    NANO_UNPACK_OK,         //成功解析出一个包
    NANO_UNPACK_OK_AND_CONTINUE,    //成功解析出一个包并且有多余的字节待解析
}nano_unpack_status_t;

typedef void* nano_coder_handle_t;

/**
 * @brief 编码/解码器接口
 * 
 * @brief coder_static_create 静态创建解码/编码器
 * @param buf 编码/解码器缓存
 * @param len 缓存大小
 * @return 编码/解码器句柄
 * 
 * @brief coder_create 创建一个编码/解码器
 * @return 编码/解码器句柄
 * 
 * @brief coder_delete 删除一个编码/解码器
 * @param handle 编码器/解码器句柄
 * 
 * @brief coder_unpack 解码
 * @param handle 编码/解码器句柄
 * @param pack 包二级指针
 * @param bytes 解码字节
 * @param len 解码字节长度
 * @return NULL:没有解析出有用的包 其他:包指针
 * 
 * @brief coder_empack 打包
 * @param handle 编码/解码器句柄
 * @param bytes_buff 编码字节缓存
 * @param len 编码字节长度
 * @return 0:编码失败 其他:编码长度
 * 
 * @brief coder_reset 重置编码器
 * @param handle 编码/解码器句柄
 */
typedef struct{
    nano_coder_handle_t (*coder_static_create)(uint8_t* buf,uint16_t len);
    nano_coder_handle_t (*coder_create)(void);
    uint8_t (*coder_delete)(nano_coder_handle_t handle);
    nano_unpack_status_t* (*coder_unpack)(nano_coder_handle_t handle,nano_pack_t** pack,uint8_t* bytes,uint16_t len);
    uint16_t (*coder_empack)(nano_coder_handle_t handle,uint8_t* bytes_buff,uint16_t buf_len);
    void (*coder_reset)(nano_coder_handle_t handle);
}nano_decoder_opt_t;
